<?php
class Search_Model_TokenFilter extends Zend_Search_Lucene_Analysis_TokenFilter
{
	private $morphy;

	public function __construct() {
		$phpmorphydir = ROOT_PATH . '/site/modules/search/models/phpmorphy/';
		require_once $phpmorphydir . "src/common.php";
		$dir = $phpmorphydir . 'dicts';
		$lang = 'ru_RU';
		$this->morphy = new phpMorphy($dir, $lang);
	}

	public function normalize(Zend_Search_Lucene_Analysis_Token $srcToken) {
		//извлекаем корень слова
		$pseudo_root = $this->morphy->getPseudoRoot(mb_strtoupper($srcToken->getTermText(), "utf-8"));
		if ($pseudo_root === false) {
			$newStr = mb_strtoupper($srcToken->getTermText(), "utf-8");
		} else {
			//если корень извлечь не удалось, тогда используем все слово целиком
			$newStr = $pseudo_root[0];
		}
		//если лексема короче 3 символов, то не используем её      
		if (mb_strlen($newStr, "utf-8") < 3) {
			return null;
		}
		$newToken = new Zend_Search_Lucene_Analysis_Token(
			$newStr,
			$srcToken->getStartOffset(),
			$srcToken->getEndOffset()
		);
		$newToken->setPositionIncrement($srcToken->getPositionIncrement());
		return $newToken;
	}
} 
